/* usplash
 *
 * gos.c - definition of chrome theme
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
 */

#include <usplash-theme.h>
#include <usplash_backend.h>


extern struct usplash_pixmap pixmap_gOS_800_600, pixmap_gOS_1024_768;
extern struct usplash_pixmap pixmap_throbber_back;
extern struct usplash_pixmap pixmap_throbber_fore;
extern struct usplash_font font_helvB10;

void t_init(struct usplash_theme* theme);
void t_clear_progressbar(struct usplash_theme* theme);
void t_draw_progressbar(struct usplash_theme* theme, int percentage);
void t_animate_step(struct usplash_theme* theme, int pulsating);

struct usplash_theme usplash_theme_1024_768;

/* Theme definition */
struct usplash_theme usplash_theme = {
	.version = THEME_VERSION, 
	.next = &usplash_theme_1024_768,
	.ratio = USPLASH_4_3,

	/* Background and font */
	.pixmap = &pixmap_gOS_800_600,
	.font   = &font_helvB10,

	/* Palette indexes */
	.background             = 0,
	.progressbar_background = 254,
	.progressbar_foreground = 0,
	.text_background        = 16,
	.text_foreground        = 254,
	.text_success           = 163,
	.text_failure           = 135,

	/* Progress bar position and size in pixels */
	.progressbar_x      = 240, /* 800/2-216/2 */
	.progressbar_y      = 370,
	.progressbar_width  = 332,
	.progressbar_height = 32,

	/* Text box position and size in pixels */
	.text_x      = 120,
	.text_y      = 430,
	.text_width  = 360,
	.text_height = 120,

	/* Text details */
	.line_height  = 15,
	.line_length  = 32,
	.status_width = 35,

	/* Functions */
	.init = t_init,
	.clear_progressbar = t_clear_progressbar,
	.draw_progressbar = t_draw_progressbar,
	.animate_step = t_animate_step,
};

struct usplash_theme usplash_theme_1024_768 = 
{
	.version = THEME_VERSION,
	.next = NULL,
	.ratio = USPLASH_4_3,

	/* Background and font */
	.pixmap = &pixmap_gOS_1024_768,
	.font   = &font_helvB10,

	/* Palette indexes */
	.background             = 0,
	.progressbar_background = 254,
	.progressbar_foreground = 0,
	.text_background        = 16,
	.text_foreground        = 254,
	.text_success           = 163,
	.text_failure           = 135,

	/* Progress bar position and size in pixels */
	.progressbar_x      = 342, /* 1024/2 - 216/2 */
	.progressbar_y      = 465,
	.progressbar_width  = 332,
	.progressbar_height = 32,

	/* Text box position and size in pixels */
	.text_x      = 322,
	.text_y      = 535,
	.text_width  = 400,
	.text_height = 165,

	/* Text details */
	.line_height  = 15,
	.line_length  = 32,
	.status_width = 35,

	/* Functions */
	.init = t_init,
	.clear_progressbar = t_clear_progressbar,
	.draw_progressbar = t_draw_progressbar,
	.animate_step = t_animate_step,
};

void t_init(struct usplash_theme *theme) 
{
	int x, y;
	usplash_getdimensions(&x, &y);
	theme->progressbar_x = (x - theme->pixmap->width)/2 + theme->progressbar_x;
	theme->progressbar_y = (y - theme->pixmap->height)/2 + theme->progressbar_y;
}

void t_clear_progressbar(struct usplash_theme *theme) 
{
  t_draw_progressbar(theme, 0);
}

void t_draw_progressbar(struct usplash_theme *theme, int percentage) 
{
	int w = (pixmap_throbber_back.width * percentage / 100);
	usplash_put(theme->progressbar_x, theme->progressbar_y, 
					&pixmap_throbber_back);
	if(percentage == 0)
		return;
	if(percentage < 0)
		usplash_put_part(theme->progressbar_x - w, theme->progressbar_y, 
								pixmap_throbber_back.width + w,	pixmap_throbber_back.height, 
								&pixmap_throbber_fore, -w, 0);
	else
		usplash_put_part(theme->progressbar_x, theme->progressbar_y, w, 
								pixmap_throbber_back.height, &pixmap_throbber_fore, 0, 0);
}

void t_animate_step(struct usplash_theme* theme, int pulsating) 
{
	static int pulsate_step = 0;
	static int pulse_width = 40;
	static int step_width = 4;
	static int num_steps = ((332 - 40)/4)-2;
	int x1;

	if (pulsating) 
	{
		t_draw_progressbar(theme, 0);

		if(pulsate_step < num_steps/2+1)
			x1 = 2 * step_width * pulsate_step;
		else
			x1 = 332 - pulse_width - 2 * step_width * (pulsate_step - num_steps/2+1);
			
		
		usplash_put_part(theme->progressbar_x + x1, theme->progressbar_y, 
								pulse_width, pixmap_throbber_fore.height, 
								&pixmap_throbber_fore, x1, 0);

		pulsate_step = (pulsate_step + 1) % num_steps;
	}
}
